package br.com.sgpv2.controler.departamento;

import java.util.List;
import java.util.Locale;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import br.com.sgpv2.controler.SGPController;
import br.com.sgpv2.entity.JsonResponse;
import br.com.sgpv2.entity.organograma.Departamento;
import br.com.sgpv2.service.departamento.DepartamentoService;
import br.com.sgpv2.service.entidade.EntidadeService;

/**
 * Handles requests for the application /departamentos.
 */


@Controller
public class DepartamentoController extends SGPController {
	
	@Autowired
	private DepartamentoService departamentoService;
	
	@Autowired
	private EntidadeService entidadeService;
	
	/**
	 * Página de departamentos - acessado pelo menu.
	 * @throws Exception.
	 */
	@RequestMapping(value = "/departamentos", method = RequestMethod.GET)
	public String departamentos(Locale locale, Model model) throws Exception {
		
		return listar(null, locale, model);
	}
	
	/**
	 * Página de departamentos - acessado pela ação de pesquisar.
	 * @throws Exception.
	 */
	@RequestMapping(value = "/departamentos", method = RequestMethod.POST)
	public String departamentosPesquisar(@RequestParam String descricao, Locale locale, Model model) throws Exception {
		
		return listar(descricao, locale, model);
	}
	
	private String listar(String descricao, Locale locale, Model model) {
		List<Departamento> departamentos = departamentoService.consultarPorDescricao(descricao);

		configurarPaginacao(departamentos, model);
		model.addAttribute("departamentos", getPagedListHolder().getPageList());
		
		return "departamentos";
	}
	
	/**
	 * avança para página de inclusão de departamento.
	 * @throws Exception 
	 */
	@RequestMapping(value = "/departamento/salvar", method = RequestMethod.GET)
	public String salvar(Model model) throws Exception {
	
		model.addAttribute("departamento", new Departamento());
		
		return "departamento_incluir";		
	}
	
	/**
	 * inclui um departamento no sistema.
	 * @throws Exception 
	 */
	@RequestMapping(value = "/departamento/salvar", method = RequestMethod.POST)
	public String salvar(@ModelAttribute Departamento departamento, Model model, BindingResult result) throws Exception {
				
		if(departamento != null){
			departamento.setEntidade(entidadeService.buscarEntidade());	
			departamentoService.salvar(departamento);
		}
		return "redirect:../departamentos";
	}
	
	/**
	 * avança para página de alteração de departamento.
	 * @throws Exception 
	 */
	@RequestMapping(value = "/departamento/alterar/{pk}", method = RequestMethod.GET)
	public String getAlterar(@PathVariable Integer pk, Model model) throws Exception {
		Departamento departamentoAlteracao = departamentoService.buscar(pk);
		if(departamentoAlteracao != null){
			model.addAttribute("departamento",departamentoAlteracao);			
			return "departamento_alterar";
		}else{
			return "redirect:../departamentos";
		}		
	}
	
	/**
	 * avança para página de alteração de secretaria.
	 * @throws Exception 
	 */
	@RequestMapping(value = "/departamento/alterar", method = RequestMethod.POST)
	public String alterar(@ModelAttribute Departamento departamento, Model model, BindingResult result) throws Exception {
			
		if(departamento != null){
			departamento.setEntidade(entidadeService.buscarEntidade());
			departamentoService.alterar(departamento);
		}
		return "redirect:../departamentos";
	}
	
	/**
	 * Exclui uma Secretaria.
	 * @throws Exception 
	 */
	@RequestMapping(value = "/departamento/excluir/{pk}", method = RequestMethod.GET)
	public String excluir(@PathVariable Integer pk, Model model) throws Exception {
		Departamento departamentoExclusao = departamentoService.buscar(pk);
		
		if(departamentoExclusao !=null){
			departamentoService.excluir(departamentoExclusao);
		}
		
		return "redirect:/departamentos";
	}
	
	/**
	 * Lista as pessoas por nome.
	 * @throws Exception 
	 */
	@ResponseBody
	@RequestMapping(value = "/departamento/validarExclusao/{idDepartamento}", method = RequestMethod.GET)
	public JsonResponse validarExclusao(@PathVariable String idDepartamento, Model model) throws Exception {		
		JsonResponse jsonResponse = new JsonResponse();
		jsonResponse.setSuccess(departamentoService.validarExclusao(idDepartamento));				
		return jsonResponse;
	}
	
	@ResponseBody
	@RequestMapping(value = "/departamento/paginacao/{acao}", method = RequestMethod.GET)
	public ModelAndView paginacao(@PathVariable String acao, Model model) throws Exception {		
		navegarPaginacao(acao, model);
		model.addAttribute("departamentos", getPagedListHolder().getPageList());
		return new ModelAndView("departamento.lista");
	}

}
